package com.itm.excel.dao.impl;

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map.Entry;

import javax.inject.Inject;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import com.itm.excel.dao.GestorExcelDao;
import com.itm.excel.modelo.LibroExcel;
import com.itm.excel.utils.Constantes;
import com.itm.excel.utils.CreaEstilos;
import com.itm.excel.utils.UtilsExcel;

public class GestorExcelDaoImpl implements GestorExcelDao {
	
	@Inject
	private LibroExcel libroExcel;

	public void addClaveValor(String clave, Object valor) {
		libroExcel.getTablaDatos().put(clave, valor);
	}

	public void imprimirExcel(String rutaExcel, String nombreHoja) {
		insertaDatos(rutaExcel, nombreHoja, libroExcel.getTablaDatos());
		libroExcel = new LibroExcel(); 
	}
	
	public void insertaDatos(String rutaExcel, String nombreHoja, 
			LinkedHashMap<String, Object> tabla) {

		rutaExcel = UtilsExcel.getRutaAbsoluta(rutaExcel);
		existeExcel(rutaExcel);

		insertaEstilos();
		insertaContenido(tabla, nombreHoja);
		UtilsExcel.guardarEnExcel(libroExcel.getExcel(), rutaExcel);
		libroExcel.setTablaDatos(null);
	}

	private void insertaEstilos() {
		CreaEstilos.creaEstiloFuente(
				libroExcel.getEstiloFuenteTexto(),
				Constantes.TAM_FUENTE_TEXTO,
				Constantes.COLOR_FUENTE_TEXTO,
				Constantes.ANCHO_FUENTE_TEXTO);
		CreaEstilos.creaEstiloFuente(
				libroExcel.getEstiloFuenteCabecera(),
				Constantes.TAM_FUENTE_CABECERA,
				Constantes.COLOR_FUENTE_CABECERA,
				Constantes.ANCHO_FUENTE_CABECERA);
		CreaEstilos.creaEstiloCelda(
				libroExcel.getEstiloCeldaTexto(), 
				libroExcel.getEstiloFuenteTexto(),
				Constantes.ALINEAMIENTO_TEXTO,
				Constantes.COLOR_RELLENO_CELDA_TEXTO,
				Constantes.PATRON_RELLENO_CELDA_TEXTO);
		CreaEstilos.creaEstiloCelda(
				libroExcel.getEstiloCeldaCabecera(), 
				libroExcel.getEstiloFuenteCabecera(),
				Constantes.ALINEAMIENTO_CELDA,
				Constantes.COLOR_RELLENO_CELDA_CABECERA,
				Constantes.PATRON_RELLENO_CELDA_CABECERA);
	}

	private void insertaContenido(LinkedHashMap<String, Object> tabla, String nombreHoja) {

		HSSFSheet hojaResultados;
		HSSFRow filaCabecera;
		HSSFRow filaDatos;
		HSSFCell celdaCabecera;
		HSSFCell celdaDato;
		ArrayList<String> datosCabecera;
		String valorCeldaCabecera;
		Entry<?, ?> e;
		int ultimaColumna;
		int posColumna;

		hojaResultados = libroExcel.getExcel().getSheet(nombreHoja);
		if (hojaResultados == null) {
			hojaResultados = libroExcel.getExcel().createSheet(nombreHoja);
			filaCabecera = hojaResultados.createRow(0);
		} else {
			filaCabecera = hojaResultados.getRow(0);
		}
		
		datosCabecera = UtilsExcel.getCeldasCabecera(filaCabecera);
		filaDatos = hojaResultados.createRow(hojaResultados.getLastRowNum()+1);
		if ((ultimaColumna = filaCabecera.getLastCellNum())==-1) {
			ultimaColumna = 0;
		}
		
		Iterator<?> it = tabla.entrySet().iterator();
		while (it.hasNext()) {
			e = (Entry<?, ?>) it.next();
			
			valorCeldaCabecera = e.getKey().toString();
			//No existe dicha cabecera
			if ((posColumna=datosCabecera.indexOf(valorCeldaCabecera))==-1) {
				//Autosize columnas
				hojaResultados.autoSizeColumn((short)ultimaColumna, true);
				//Inserta Cabeceras
				celdaCabecera = filaCabecera.createCell(ultimaColumna);
				celdaCabecera.setCellValue(new HSSFRichTextString(valorCeldaCabecera));
				celdaCabecera.setCellStyle(libroExcel.getEstiloCeldaCabecera());				
				//Inserta Datos				
				celdaDato = filaDatos.createCell(ultimaColumna++);
				celdaDato.setCellValue(new HSSFRichTextString(e.getValue().toString()));
				celdaDato.setCellStyle(libroExcel.getEstiloCeldaTexto());
			} else {
				//Autosize columnas
				hojaResultados.autoSizeColumn((short)posColumna, true);
				//Inserta Datos		
				celdaDato = filaDatos.createCell(posColumna);
				celdaDato.setCellValue(new HSSFRichTextString(e.getValue().toString()));
				celdaDato.setCellStyle(libroExcel.getEstiloCeldaTexto());
			}
		}
	}
	
	private void existeExcel(String rutaExcel) {
		File ficheroExcel = new File(rutaExcel);
		if (ficheroExcel.exists()) {
			HSSFWorkbook excel = UtilsExcel.getFicheroExcel(rutaExcel);
			libroExcel = new LibroExcel(excel); //Se vacia el buffer de datos
		}
	}
}